package 多线程.三个线程实现顺序打印;

/**
 * 这个写法是唯一的与其它区别很大的方法,理解下ThreadLocal就好
 *
 * ThreadLocal主要方法的作用：
 * get()：返回此线程局部变量的当前线程副本中的值
 * remove()：移除此线程局部变量当前线程的值
 * set(T value)：将此线程局部变量的当前线程副本中的值设置为指定值
 *
 * 子线程是并发执行的,但是主线程的代码是顺序执行的,在主线程里改变变量,子线程根据变量判断
 * 那么有个问题,子线程怎么获取主线程的变量呢？可以用InheritableThreadLocal
 */

/**
 * 这个方式不对欧
 * 多执行几次出现不同于要求的场景
 */
public class Test8 {
    public static void main(String[] args) {
        //使用ThreadLocal存储变量
        ThreadLocal<Integer> threadLocal = new InheritableThreadLocal<>();
        threadLocal.set(1);
        Thread t1 = new Thread() {
            @Override
            public void run() {
                System.out.println("A");
            }
        };
        t1.start();
        //设置变量值
        threadLocal.set(2);
        Thread t2 = new Thread() {
            @Override
            public void run() {
                //等待
                while (threadLocal.get() != 2) {
                }
                System.out.println("B");
            }
        };
        t2.start();
        threadLocal.set(3);
        Thread t3 = new Thread() {
            @Override
            public void run() {
                while (threadLocal.get() != 3) {
                }
                System.out.println("C");
            }
        };
        t3.start();
    }
}
